from sys import pycache_prefix

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
##############################################
# @Author: DengLibin 榆霖
# @Date: Create in 2022-03-04 16:11:17
# @Description:  collections是Python内建的一个集合模块，提供了许多有用的集合类
##############################################
'module name'
__author__ = 'DengLibin'
#if __name__ == '__main__':

# namedtuple
from collections import namedtuple, defaultdict, deque, OrderedDict,Counter

# namedtuple是一个函数，它用来创建一个自定义的tuple对象，并且规定了tuple元素的个数，并可以用属性而不是索引来引用tuple的某个元素。
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)

print(p.x, p.y)

print(isinstance(p, Point)) #True
print(isinstance(p, tuple)) #True

# 类似的，如果要用坐标和半径表示一个圆，也可以用namedtuple定义：

# namedtuple('名称', [属性list]):
Circle = namedtuple('Circle', ['x', 'y', 'r'])

# deque
# 使用list存储数据时，按索引访问元素很快，但是插入和删除元素就很慢了，因为list是线性存储，数据量大的时候，插入和删除效率很低。

# deque是为了高效实现插入和删除操作的双向列表，适合用于队列和栈：

q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
print(q)

# deque除了实现list的append()和pop()外，还支持appendleft()和popleft()，这样就可以非常高效地往头部添加或删除元素。


# defaultdict
# 使用dict时，如果引用的Key不存在，就会抛出KeyError。如果希望key不存在时，返回一个默认值，就可以用defaultdict：


dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
print(dd['key1']) # abc
print(dd['key2']) # N/A



# OrderedDict
# 使用dict时，Key是无序的。在对dict做迭代时，我们无法确定Key的顺序。

# 如果要保持Key的顺序，可以用OrderedDict：
# OrderedDict的Key会按照插入的顺序排列，不是Key本身排序：
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
od['x'] = 34
od['d'] = 23
print(od)

# Counter
# Counter是一个简单的计数器，例如，统计字符出现的个数：
c = Counter()
for ch in 'programming':
    c[ch] = c[ch] + 1
print(c)
c.update('hello')
print(c)
# Counter实际上也是dict的一个子类，上面的结果可以看出每个字符出现的次数。

# 小结
# collections模块提供了一些有用的集合类，可以根据需要选用。